用分類(Classification)方法,一步步學會如何找出可疑交易
步驟 | 在做什麼 | 白話名詞 | 生活比喻 |
---|---|---|---|
1 | 問題:分正常或詐欺 | 分類:兩類 | 分水果是蘋果或橘子 |
2 | 打開資料 | 資料表格 | 打開 Excel |
3 | 分練習/考試 | train/test | 把題目分成練習卷 & 考卷 |
4 | 補齊少數例子 | SMOTE | 請臨演多演冷門角色 |
5 | 建立模型 | 隨機森林 | 一群老師投票決定 |
6 | 做預測 | predict | 老師幫忙批考卷 |
7 | 看成績 | Precision/Recall | 看對幾題、錯幾題 |
8 | 解釋結果 | Accuracy ≠ 全部 | 考99分但錯在重點題 |
9 | 改進方法 | 換模型 / 調門檻 | 醫生判斷嚴格或放寬 |
👉 就像醫生判斷病人是「健康」還是「生病」一樣,電腦要學會把交易分成「安全」或「可疑」。
📌 問題:詐欺交易很少,通常不到 1%。這叫做「不平衡資料」。
python
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, confusion_matrix
from imblearn.over_sampling import SMOTE
df = pd.read_csv("creditcard.csv")
X = df.drop("Class", axis=1) # 除了 Class 以外的所有欄位
y = df["Class"] # 0 或 1
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42, stratify=y
)
smote = SMOTE(random_state=42)
X_train_res, y_train_res = smote.fit_resample(X_train, y_train)
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train_res, y_train_res)
y_pred = clf.predict(X_test)
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred, digits=4))
混淆矩陣(Confusion Matrix)
[[56845 10]
[ 25 102]]
左上角:正確判斷「正常交易」
右下角:正確判斷「詐欺」
右上角:把正常誤判成詐欺(假警報)
左下角:把詐欺當成正常(漏掉!)
分類報告(Classification Report)
precision recall f1-score support
0 0.9996 0.9998 0.9997 (正常)
1 0.9107 0.8031 0.8537 (詐欺)
預測:正常 (0) | 預測:詐欺 (1) | |
---|---|---|
實際:正常 (0) | 真正例 (TN):56845 ✅ | 假正例 (FP):10 ❌ |
實際:詐欺 (1) | 假負例 (FN):25 ❌ | 真正例 (TP):102 ✅ |
Accuracy(99.9%):看起來超高,但因為正常交易很多,不代表真的厲害。
Recall(80.3%):還有快 20% 的詐欺交易沒抓到。
Precision(91.1%):有 9% 的交易其實不是詐欺卻被誤報。
👉 在金融業,漏抓詐欺(Recall 太低)比誤抓更危險。
換更厲害的模型(例如 XGBoost、LightGBM)。
調整判斷門檻:不要只看大於 0.5 就判詐欺,可以改成 0.3 或 0.7。
加更多特徵,例如「使用地點」、「交易裝置」。
使用「異常偵測」的方法來輔助。
如果要放到網路服務(Web Modern)
建立 API:把模型放在伺服器,讓系統能即時查詢。
人工覆核:高風險交易要交給人員再次確認。
監控:即時看 Recall、Precision,避免模型變差。
更新:定期用新資料重新訓練。
Q:為什麼不能只看準確率?
A:因為正常交易太多,準確率會誤導,要看 Recall。
Q:SMOTE 是什麼?
A:一種把少數類別(詐欺)複製+合成,讓資料更平衡的方法。
Q:調整門檻有什麼用?
A:可以控制「寧可多誤報,也不要漏掉」或相反。
🔄 回顧總表(入門版)
步驟 做什麼 白話解釋
1 問題設定 讓電腦判斷交易是「正常」還是「詐欺」
2 準備資料 有金額、時間、行為特徵,但詐欺很少
3 處理資料 用 SMOTE 平衡數據,標準化數值
4 寫程式 用 Python 建立隨機森林模型
5 看結果 混淆矩陣 + Precision/Recall
6 解讀 高準確率≠好,重點是漏判少
7 改進方法 換模型、調門檻、加特徵
8 放到網路 API + 人工覆核 + 監控更新
9 FAQ 回答常見疑問,避免誤解
🔗 信用卡詐欺偵測 × Web Modern 的關係
在 Web Modern 的思維裡,重點是把 資料處理、AI 模型、即時互動 與 網路應用 整合成一個完整服務。
前端(Frontend):例如銀行的網頁或手機 App,當使用者刷卡時,交易資料會即時送出。
後端(Backend + AI 模型):模型接收到交易資料,立即判斷這筆交易是不是可疑(分類:0 正常 / 1 詐欺)。
回饋(Feedback Loop):結果會回傳給系統,如果是高風險,就可能觸發「簡訊驗證」或「人工覆核」。
監控與更新(Monitoring & Update):Web Modern 強調即時監控,因此 Recall、Precision 這些指標要能在線上看;同時也要能自動更新模型,避免資料過時。
👉 換句話說,信用卡詐欺偵測只是 一個 AI 模型,而 Web Modern 提供了「把它放進線上應用」的基礎設施,讓模型不只是做研究,而是能真正即時保護使用者。
副標題|從概念 → 資料 → 程式碼 → 名詞,逐步學會分類分析
學習階段 | 學習重點 | Python 程式碼(片段) | 名詞 & 語法說明 |
---|---|---|---|
1. 認識分類問題 | 什麼是「分類」?我們要把交易分成 正常(0) 或 詐欺(1) | (無程式) | 分類 (Classification):把資料分成不同類別。Label(標籤):這裡是 0 或 1。 |
2. 載入資料 | 先把資料讀進來,看看有哪些欄位 | python<br>import pandas as pd<br>df = pd.read_csv("creditcard.csv")<br> |
pandas:Python 常用的資料處理套件。read_csv :讀取 CSV 檔案。 |
3. 切分資料 | 把資料分成 訓練集(80%) 和 測試集(20%) | python<br>from sklearn.model_selection import train_test_split<br>X = df.drop("Class", axis=1)<br>y = df["Class"]<br>X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, stratify=y, random_state=42)<br> |
train_test_split:切分資料。stratify=y :保持類別比例不失真。 |
4. 平衡資料 | 用 SMOTE 讓「詐欺交易」的樣本增加 | python<br>from imblearn.over_sampling import SMOTE<br>smote = SMOTE(random_state=42)<br>X_train_res, y_train_res = smote.fit_resample(X_train, y_train)<br> |
SMOTE:過採樣方法,讓少數類別(詐欺)變多。fit_resample :生成新的訓練資料。 |
5. 建立模型 | 用 隨機森林 (Random Forest) 訓練 | python<br>from sklearn.ensemble import RandomForestClassifier<br>clf = RandomForestClassifier(n_estimators=100, random_state=42)<br>clf.fit(X_train_res, y_train_res)<br> |
RandomForestClassifier:一種樹模型,常用於分類。n_estimators=100 :用 100 棵樹。 |
6. 預測 | 用模型判斷測試集的資料 | python<br>y_pred = clf.predict(X_test)<br> |
predict:輸入測試資料,輸出預測結果(0 或 1)。 |
7. 評估模型 | 看混淆矩陣與指標 | python<br>from sklearn.metrics import classification_report, confusion_matrix<br>print(confusion_matrix(y_test, y_pred))<br>print(classification_report(y_test, y_pred, digits=4))<br> |
confusion_matrix:看對/錯的判斷數量。classification_report:Precision、Recall、F1。 |
8. 解釋結果 | - Accuracy 很高可能是因為「正常交易多」- Recall 低代表漏抓詐欺 | (無程式) | Accuracy:整體正確率。Precision:判成詐欺中,正確比例。Recall:真正的詐欺被抓到的比例。 |
9. 改進方法 | - 換更強模型(XGBoost)- 調整閾值- 加新特徵 | (進階程式可補充) | Threshold:分類的門檻。特徵 (Feature):用來判斷的變數。 |
步驟 | 白話解釋 | 程式碼重點 |
---|---|---|
1 | 知道要分成正常/詐欺 | (無程式) |
2 | 載入資料 | pd.read_csv |
3 | 切分訓練/測試集 | train_test_split |
4 | 平衡資料 | SMOTE |
5 | 建立模型 | RandomForestClassifier |
6 | 做預測 | .predict() |
7 | 評估表現 | confusion_matrix / classification_report |
8 | 看懂數字 | Accuracy / Precision / Recall |
9 | 改進與調整 | 換模型、調 threshold、加特徵 |